本篇文章將要說明陣列修改器$push,主要就是針對document中的陣列進行修改,同時他也可以搭配$each、$slice、$ne、$addToSet、$pop、$pull來使用。
呼好多……
$push$push是陣列修改器,假如一個document中已經有陣列的結構,使用push會在陣列的尾末加入一個新元素,要是本來就沒有這個陣列,則會自動新建一筆。
使用方法如下範例,首先先新增一筆資料,然後新增加一個叫jack的fans。
db.user.insert({
"name" : "mark",
"fans" : ["steven","crisis","stanly"]
})
db.user.update({"name":"mark"},
{$push:{"fans" : "jack"}
})
結果如下圖。

$each$push一次新增只能新增一筆元素,而搭配$each就可以新增多筆。
使用方法如下範例,一樣首先新增一筆資料,然後這時我們一次新增三個fans分別為jack、landry、max。
db.user.insert({
"name" : "mark",
"fans" : ["steven","crisis","stanly"]
})
db.user.update({"name":"mark"},
{"$push" : {"fans" : {"$each" : ["jack","lnadry","max"]}}}
)
結果如下圖

$slice如果你希望限制一個陣列的大小,就算多push進元素,也不要超過限制大小,這時你就可以用$slice,不過注意它是保留最後n個元素。
使用方法如下範例,新增一筆資料,然後我們希望fans人數不超過5人,但我們硬多塞一個人進去。
db.user.insert({
"name" : "mark",
"fans" : ["steven","crisis","stanly"]
})
db.user.update({"name":"mark"},
{"$push" : {"fans" :
{"$each" : ["jack","lnadry","max"],
"$slice" : -5 }}}
)
執行結果如下,可以看到第一位steven被刪除,只保留了最後5位。

$addToSet你可能有這個需求,假設你要新增一個元素到陣列裡,並且保證陣列內的元素不會重複,這時就可以使用$addToSet。
使用方法如下範例,新增一筆資料,然後fans有steven、landry、stanly,這時我們在新增steven和jack進去,預期應該steven不會被新增進去,也就是不會產生兩個steven。
db.user.insert({
"name" : "mark",
"fans" : ["steven","crisis","stanly"]
})
db.user.update({"name":"mark"},
{"$addToSet" : {"fans" :
{"$each" : ["steven","jack"] }}}
)
執行結果如下,符合預期。

$pop與$pull$pop與$pull這兩個修改器都是用來刪除元素用的,$pop可以從頭或尾刪除,而$pull則是基於特定條件來刪除。
先來看看$pop的使用範例。其中"fans":1代表從fans陣列尾刪除"fans":-1則從陣列頭刪除。
db.user.insert({
"name" : "mark",
"fans" : ["steven","crisis","stanly"]
})
db.user.update({"name":"mark"},
{"$pop" : {"fans":1}}
)
下圖為執行結果。

這時我們在來看看$pull用法,假設我們要將crisis這fans刪除,使用方法如下。
db.user.insert({
"name" : "mark",
"fans" : ["steven","crisis","stanly"]
})
db.user.update({"name":"mark"},
{"$pull" : {"fans":"crisis"}}
)
執行結果如下圖

今天說了不少個修改器簡單的進行總結一下。
$push。$each。$slice。$addToSet。$pop和$pull。結束……又快要燒起來的fu,+u^6。